home *** CD-ROM | disk | FTP | other *** search
- /*---------------------------------------------------------------------------
-
- unzip.h
-
- This header file is used by all of the unzip source files. Its contents
- are divided into seven more-or-less separate sections: predefined macros,
- OS-dependent includes, (mostly) OS-independent defines, typedefs, function
- prototypes (or "prototypes," in the case of non-ANSI compilers), macros,
- and global-variable declarations.
-
- ---------------------------------------------------------------------------*/
-
-
-
- /*****************************************/
- /* Predefined, Machine-specific Macros */
- /*****************************************/
-
- #if (defined(__GO32__) && defined(unix)) /* DOS extender */
- # undef unix
- #endif
-
- #if defined(unix) || defined(__convexc__) || defined(M_XENIX)
- # ifndef UNIX
- # define UNIX
- # endif /* !UNIX */
- #endif /* unix || __convexc__ || M_XENIX */
-
- /* Much of the following is swiped from zip's tailor.h: */
-
- /* define MSDOS for Turbo C (unless OS/2) and Power C as well as Microsoft C */
- #ifdef __POWERC
- # define __TURBOC__
- # define MSDOS
- #endif /* __POWERC */
- #if (defined(__TURBOC__) && defined(__MSDOS__) && !defined(MSDOS))
- # define MSDOS
- #endif
-
- /* use prototypes and ANSI libraries if __STDC__, or Microsoft or Borland C,
- * or Silicon Graphics, or Convex, or IBM C Set/2, or GNU gcc under emx, or
- * or Watcom C, or Macintosh, or Windows NT.
- */
- #if (__STDC__ || defined(MSDOS) || defined(sgi) || defined(CONVEX))
- # ifndef PROTO
- # define PROTO
- # endif
- # define MODERN
- #endif
- #if (defined(__IBMC__) || defined(__EMX__) || defined(__WATCOMC__))
- # ifndef PROTO
- # define PROTO
- # endif
- # define MODERN
- #endif
- #if (defined(THINK_C) || defined(MPW) || defined(WIN32))
- # ifndef PROTO
- # define PROTO
- # endif
- # define MODERN
- #endif
-
- /* turn off prototypes if requested */
- #if (defined(NOPROTO) && defined(PROTO))
- # undef PROTO
- #endif
-
- /* used to remove arguments in function prototypes for non-ANSI C */
- #ifdef PROTO
- # define OF(a) a
- #else /* !PROTO */
- # define OF(a) ()
- #endif /* ?PROTO */
-
- #if (defined(ultrix) || defined(bsd4_2) || defined(sun) || defined(pyr))
- # if (!defined(BSD) && !defined(__SYSTEM_FIVE) && !defined(SYSV))
- # define BSD
- # endif /* !BSD && !__SYSTEM_FIVE && !SYSV */
- #endif /* ultrix || bsd4_2 || sun || pyr */
-
- #if (defined(CONVEX) || defined(CRAY) || defined(__SYSTEM_FIVE))
- # ifndef TERMIO
- # define TERMIO
- # endif /* !TERMIO */
- #endif /* CONVEX || CRAY || __SYSTEM_FIVE */
-
- #ifdef pyr /* Pyramid */
- # ifndef ZMEM
- # define ZMEM
- # endif /* !ZMEM */
- #endif /* pyr */
-
- #ifdef CRAY
- # ifdef ZMEM
- # undef ZMEM
- # endif /* ZMEM */
- #endif /* CRAY */
-
- /* the i386 test below is to catch SCO Unix (which has redefinition
- * warnings if param.h is included), but it probably doesn't hurt if
- * other 386 Unixes get nailed, too...except now that 386BSD and BSDI
- * exist. Sigh. <sys/param.h> is mostly included for "BSD", I think.
- * [An alternate fix for SCO Unix is below.]
- */
- #if (defined(MINIX) || (defined(i386) && defined(unix)))
- # define NO_PARAM_H
- #endif /* MINIX || (i386 && unix) */
-
-
-
-
-
- /***************************/
- /* OS-Dependent Includes */
- /***************************/
-
- #ifndef MINIX /* Minix needs it after all the other includes (?) */
- # include <stdio.h>
- #endif
- #include <ctype.h> /* skip for VMS, to use tolower() function? */
- #include <errno.h> /* used in mapname() */
- #ifndef NO_ERRNO
- # define DECLARE_ERRNO /* everybody except MSC 6.0, SCO cc, Watcom C/386 */
- #endif /* !NO_ERRNO */
- #ifdef VMS
- # include <types.h> /* (placed up here instead of in VMS section below */
- # include <stat.h> /* because types.h is used in some other headers) */
- #else /* !VMS */
- # if !defined(THINK_C) && !defined(MPW)
- # include <sys/types.h> /* off_t, time_t, dev_t, ... */
- # include <sys/stat.h>
- # endif /* !THINK_C && !MPW */
- #endif /* ?VMS */
-
- #ifdef MODERN
- # if (!defined(M_XENIX) && !(defined(__GNUC__) && defined(sun)))
- # include <stddef.h>
- # endif
- # if (!defined(__GNUC__) && !defined(apollo)) /* both define __STDC__ */
- # include <stdlib.h> /* standard library prototypes, malloc(), etc. */
- # else
- # ifdef __EMX__
- # include <stdlib.h> /* emx IS gcc but has stdlib.h */
- # endif
- # endif
- # include <string.h> /* defines strcpy, strcmp, memcpy, etc. */
- typedef size_t extent;
- typedef void voidp;
- #else /* !MODERN */
- char *malloc();
- char *strchr(), *strrchr();
- long lseek();
- typedef unsigned int extent;
- # define void int
- typedef char voidp;
- #endif /* ?MODERN */
-
- /* this include must be down here for SysV.4, for some reason... */
- #include <signal.h> /* used in unzip.c, file_io.c */
-
-
-
- /*---------------------------------------------------------------------------
- Next, a word from our Unix (mostly) sponsors:
- ---------------------------------------------------------------------------*/
-
- #ifdef UNIX
- # ifdef AMIGA
- # include <libraries/dos.h>
- # else /* !AMIGA */
- # ifndef NO_PARAM_H
- #if 0 /* [GRR: this is an alternate fix for SCO's redefinition bug] */
- # ifdef NGROUPS_MAX
- # undef NGROUPS_MAX /* SCO bug: defined again in <param.h> */
- # endif /* NGROUPS_MAX */
- #endif /* 0 */
- # include <sys/param.h> /* conflict with <sys/types.h>, some systems? */
- # endif /* !NO_PARAM_H */
- # endif /* ?AMIGA */
-
- # ifndef BSIZE
- # ifdef MINIX
- # define BSIZE 1024
- # else /* !MINIX */
- # define BSIZE DEV_BSIZE /* assume common for all Unix systems */
- # endif /* ?MINIX */
- # endif
-
- # ifndef BSD
- # if (!defined(AMIGA) && !defined(MINIX))
- # define NO_MKDIR /* for mapname() */
- # endif /* !AMIGA && !MINIX */
- # include <time.h>
- struct tm *gmtime(), *localtime();
- # else /* BSD */
- # include <sys/time.h>
- # include <sys/timeb.h>
- # ifdef _AIX
- # include <time.h>
- # endif
- # endif
-
- #else /* !UNIX */
- # define BSIZE 512 /* disk block size */
- #endif /* ?UNIX */
-
- #if (defined(V7) || defined(BSD))
- # define strchr index
- # define strrchr rindex
- #endif
-
- /*---------------------------------------------------------------------------
- And now, our MS-DOS and OS/2 corner:
- ---------------------------------------------------------------------------*/
-
- #ifdef __TURBOC__
- # define DOS_OS2
- # include <sys/timeb.h> /* for structure ftime */
- # ifndef __BORLANDC__ /* there appears to be a bug (?) in Borland's */
- # include <mem.h> /* MEM.H related to __STDC__ and far poin- */
- # endif /* ters. (dpk) [mem.h included for memcpy] */
- # include <dos.h> /* for REGS macro (at least for Turbo C 2.0) */
- #else /* NOT Turbo C (or Power C)... */
- # ifdef MSDOS /* but still MS-DOS, so we'll assume it's */
- # ifndef MSC /* Microsoft's compiler and fake the ID, if */
- # define MSC /* necessary (it is in 5.0; apparently not */
- # endif /* in 5.1 and 6.0) */
- # include <dos.h> /* for _dos_setftime() */
- # endif
- #endif
-
- #if (defined(__IBMC__) && defined(__OS2__))
- # define DOS_OS2
- # define S_IFMT 0xF000
- # define timezone _timezone
- #endif
-
- #ifdef __WATCOMC__
- # define DOS_OS2
- # define __32BIT__
- # ifdef DECLARE_ERRNO
- # undef DECLARE_ERRNO
- # endif
- # undef far
- # define far
- #endif
-
- #ifdef __EMX__
- # define DOS_OS2
- # define __32BIT__
- # define far
- #endif /* __EMX__ */
-
- #ifdef MSC /* defined for all versions of MSC now */
- # define DOS_OS2 /* Turbo C under DOS, MSC under DOS or OS/2 */
- # if (defined(_MSC_VER) && (_MSC_VER >= 600)) /* new with 5.1 or 6.0 ... */
- # undef DECLARE_ERRNO /* errno is now a function in a dynamic link */
- # endif /* library (or something)--incompatible with */
- #endif /* the usual "extern int errno" declaration */
-
- #ifdef DOS_OS2 /* defined for all MS-DOS and OS/2 compilers */
- # include <io.h> /* lseek(), open(), setftime(), dup(), creat() */
- # include <time.h> /* localtime() */
- #endif
-
- #ifdef OS2 /* defined for all OS/2 compilers */
- # ifdef isupper
- # undef isupper
- # endif
- # ifdef tolower
- # undef tolower
- # endif
- # define isupper(x) IsUpperNLS((unsigned char)(x))
- # define tolower(x) ToLowerNLS((unsigned char)(x))
- #endif
-
- #ifdef WIN32
- # include <io.h> /* read(), open(), etc. */
- # include <time.h>
- # include <memory.h>
- # include <direct.h> /* mkdir() */
- # ifdef FILE_IO_C
- # include <fcntl.h>
- # include <conio.h>
- # include <sys\types.h>
- # include <sys\utime.h>
- # include <windows.h>
- # define DOS_OS2
- # define getch() getchar()
- # endif
- #endif
-
- /*---------------------------------------------------------------------------
- Followed by some VMS (mostly) stuff:
- ---------------------------------------------------------------------------*/
-
- #ifdef VMS
- # include <time.h> /* the usual non-BSD time functions */
- # include <file.h> /* same things as fcntl.h has */
- # include <rms.h>
- # define _MAX_PATH NAM$C_MAXRSS /* to define FILNAMSIZ below */
- # define UNIX /* can share most of same code from now on */
- # define RETURN return_VMS /* VMS interprets return codes incorrectly */
- #else /* !VMS */
- # ifndef THINK_C
- # define RETURN return /* only used in main() */
- # else
- # define RETURN(v) { int n;\
- n = (v);\
- fprintf(stderr, "\npress <return> to continue ");\
- while (getc(stdin) != '\n');\
- putc('\n', stderr);\
- InitCursor();\
- goto start;\
- }
- # endif
- # ifdef V7
- # define O_RDONLY 0
- # define O_WRONLY 1
- # define O_RDWR 2
- # else /* !V7 */
- # ifdef MTS
- # include <sys/file.h> /* MTS uses this instead of fcntl.h */
- # include <timeb.h>
- # include <time.h>
- # else /* !MTS */
- # ifdef COHERENT /* Coherent 3.10/Mark Williams C */
- # include <sys/fcntl.h>
- # define SHORT_NAMES
- # define tzset settz
- # else /* !COHERENT */
- # include <fcntl.h> /* O_BINARY for open() w/o CR/LF translation */
- # endif /* ?COHERENT */
- # endif /* ?MTS */
- # endif /* ?V7 */
- #endif /* ?VMS */
-
- #if (defined(MSDOS) || defined(VMS))
- # define DOS_VMS
- #endif
-
- /*---------------------------------------------------------------------------
- And some Mac stuff for good measure:
- ---------------------------------------------------------------------------*/
-
- #ifdef THINK_C
- # define MACOS
- # ifndef __STDC__ /* if Think C hasn't defined __STDC__ ... */
- # define __STDC__ 1 /* make sure it's defined: it needs it */
- # else /* __STDC__ defined */
- # if !__STDC__ /* sometimes __STDC__ is defined as 0; */
- # undef __STDC__ /* it needs to be 1 or required header */
- # define __STDC__ 1 /* files are not properly included. */
- # endif /* !__STDC__ */
- # endif /* ?defined(__STDC__) */
- #endif /* THINK_C */
-
- #ifdef MPW
- # define MACOS
- # include <Errors.h>
- # include <Files.h>
- # include <Memory.h>
- # include <Quickdraw.h>
- # include <ToolUtils.h>
- # define CtoPstr c2pstr
- # define PtoCstr p2cstr
- # ifdef CR
- # undef CR
- # endif
- #endif /* MPW */
-
- #ifdef MACOS
- # define open(x,y) macopen(x,y, gnVRefNum, glDirID)
- # define close macclose
- # define read macread
- # define write macwrite
- # define lseek maclseek
- # define creat(x,y) maccreat(x, gnVRefNum, glDirID, gostCreator, gostType)
- # define stat(x,y) macstat(x,y,gnVRefNum, glDirID)
-
- # ifndef isascii
- # define isascii(c) ((unsigned char)(c) <= 0x3F)
- # endif
-
- # include "macstat.h"
-
- typedef struct _ZipExtraHdr {
- unsigned short header; /* 2 bytes */
- unsigned short data; /* 2 bytes */
- } ZIP_EXTRA_HEADER;
-
- typedef struct _MacInfoMin {
- unsigned short header; /* 2 bytes */
- unsigned short data; /* 2 bytes */
- unsigned long signature; /* 4 bytes */
- FInfo finfo; /* 16 bytes */
- unsigned long lCrDat; /* 4 bytes */
- unsigned long lMdDat; /* 4 bytes */
- unsigned long flags ; /* 4 bytes */
- unsigned long lDirID; /* 4 bytes */
- /*------------*/
- } MACINFOMIN; /* = 40 bytes for size of data */
-
- typedef struct _MacInfo {
- unsigned short header; /* 2 bytes */
- unsigned short data; /* 2 bytes */
- unsigned long signature; /* 4 bytes */
- FInfo finfo; /* 16 bytes */
- unsigned long lCrDat; /* 4 bytes */
- unsigned long lMdDat; /* 4 bytes */
- unsigned long flags ; /* 4 bytes */
- unsigned long lDirID; /* 4 bytes */
- char rguchVolName[28]; /* 28 bytes */
- /*------------*/
- } MACINFO; /* = 68 bytes for size of data */
- #endif /* MACOS */
-
- /*---------------------------------------------------------------------------
- And finally, some random extra stuff:
- ---------------------------------------------------------------------------*/
-
- #ifdef MINIX
- # include <stdio.h>
- #endif
-
- #ifdef SHORT_NAMES /* Mark Williams C, ...? */
- # define extract_or_test_files xtr_or_tst_files
- # define extract_or_test_member xtr_or_tst_member
- #endif
-
- #ifdef MTS
- # include <unix.h> /* Some important non-ANSI routines */
- # define mkdir(s,n) (-1) /* No "make directory" capability */
- # define EBCDIC /* Set EBCDIC conversion on */
- #endif
-
-
-
-
-
- /*************/
- /* Defines */
- /*************/
-
- #ifndef WSIZE
- # define WSIZE 0x8000 /* window size--must be a power of two, and */
- #endif /* !WSIZE */ /* at least 32K for zip's deflate method */
-
- #define DIR_BLKSIZ 64 /* number of directory entries per block
- * (should fit in 4096 bytes, usually) */
- #ifndef INBUFSIZ
- # define INBUFSIZ 2048 /* works for MS-DOS small model */
- #endif /* !INBUFSIZ */
-
- /*
- * If <limits.h> exists on most systems, should include that, since it may
- * define some or all of the following: NAME_MAX, PATH_MAX, _POSIX_NAME_MAX,
- * _POSIX_PATH_MAX.
- */
- #ifdef DOS_OS2
- # include <limits.h>
- #endif /* DOS_OS2 */
-
- #ifdef _MAX_PATH
- # define FILNAMSIZ (_MAX_PATH)
- #else /* !_MAX_PATH */
- # define FILNAMSIZ 1025
- #endif /* ?_MAX_PATH */
-
- #ifndef PATH_MAX
- # ifdef MAXPATHLEN /* defined in <sys/param.h> some systems */
- # define PATH_MAX MAXPATHLEN
- # else
- # if FILENAME_MAX > 255 /* used like PATH_MAX on some systems */
- # define PATH_MAX FILENAME_MAX
- # else
- # define PATH_MAX (FILNAMSIZ - 1)
- # endif
- # endif /* ?MAXPATHLEN */
- #endif /* !PATH_MAX */
-
- #define OUTBUFSIZ INBUFSIZ
-
- #define ZSUFX ".zip"
- #define CENTRAL_HDR_SIG "\113\001\002" /* the infamous "PK" signature */
- #define LOCAL_HDR_SIG "\113\003\004" /* bytes, sans "P" (so unzip */
- #define END_CENTRAL_SIG "\113\005\006" /* executable not mistaken for */
- #define EXTD_LOCAL_SIG "\113\007\010" /* zipfile itself) */
-
- #define SKIP 0 /* choice of activities for do_string() */
- #define DISPLAY 1
- #define FILENAME 2
- #define EXTRA_FIELD 3
-
- #define DOES_NOT_EXIST -1 /* return values for check_for_newer() */
- #define EXISTS_AND_OLDER 0
- #define EXISTS_AND_NEWER 1
-
- #define DOS_OS2_FAT_ 0 /* version_made_by codes (central dir) */
- #define AMIGA_ 1
- #define VMS_ 2 /* make sure these are not defined on */
- #define UNIX_ 3 /* the respective systems!! (like, for */
- #define VM_CMS_ 4 /* instance, "VMS", or "UNIX": CFLAGS = */
- #define ATARI_ 5 /* -O -DUNIX) */
- #define OS2_HPFS_ 6
- #define MAC_ 7
- #define Z_SYSTEM_ 8
- #define CPM_ 9
- /* #define TOPS20_ 10? (TOPS20_ is to be defined in PKZIP 2.0...) */
- #define NUM_HOSTS 10 /* index of last system + 1 */
-
- #define STORED 0 /* compression methods */
- #define SHRUNK 1
- #define REDUCED1 2
- #define REDUCED2 3
- #define REDUCED3 4
- #define REDUCED4 5
- #define IMPLODED 6
- #define TOKENIZED 7
- #define DEFLATED 8
- #define NUM_METHODS 9 /* index of last method + 1 */
- /* don't forget to update list_files() appropriately if NUM_METHODS changes */
-
- #define DF_MDY 0 /* date format 10/26/91 (USA only) */
- #define DF_DMY 1 /* date format 26/10/91 (most of the world) */
- #define DF_YMD 2 /* date format 91/10/26 (a few countries) */
-
- #define UNZIP_VERSION 20 /* compatible with PKUNZIP 2.0 */
- #define VMS_VERSION 42 /* if OS-needed-to-extract is VMS: can do */
-
- /*---------------------------------------------------------------------------
- True sizes of the various headers, as defined by PKWare--so it is not
- likely that these will ever change. But if they do, make sure both these
- defines AND the typedefs below get updated accordingly.
- ---------------------------------------------------------------------------*/
- #define LREC_SIZE 26 /* lengths of local file headers, central */
- #define CREC_SIZE 42 /* directory headers, and the end-of- */
- #define ECREC_SIZE 18 /* central-dir record, respectively */
-
- #define MAX_BITS 13 /* used in unShrink() */
- #define HSIZE (1 << MAX_BITS) /* size of global work area */
-
- #define LF 10 /* '\n' on ASCII machines. Must be 10 due to EBCDIC */
- #define CR 13 /* '\r' on ASCII machines. Must be 13 due to EBCDIC */
- #define CTRLZ 26 /* DOS & OS/2 EOF marker (used in file_io.c, vms.c) */
-
- #ifdef EBCDIC
- # define ascii_to_native(c) ebcdic[(c)]
- # define NATIVE "EBCDIC"
- #endif
-
- #if MPW
- # define FFLUSH putc('\n',stderr);
- #else /* !MPW */
- # define FFLUSH fflush(stderr);
- #endif /* ?MPW */
-
- #ifdef VMS
- # define ENV_UNZIP "UNZIP_OPTS" /* name of environment variable */
- # define ENV_ZIPINFO "ZIPINFO_OPTS"
- #else /* !VMS */
- # define ENV_UNZIP "UNZIP"
- # define ENV_ZIPINFO "ZIPINFO"
- #endif /* ?VMS */
-
- #ifdef CRYPT
- # define PWLEN 80
- # define DECRYPT(b) (update_keys(t=((b)&0xff)^decrypt_byte()),t)
- #endif /* CRYPT */
-
- #ifdef QQ /* Newtware version */
- # define QCOND (!quietflg) /* for no file comments with -vq or -vqq */
- #else /* (original) Bill Davidsen version */
- # define QCOND (which_hdr) /* no way to kill file comments with -v, -l */
- #endif
-
- #ifndef TRUE
- # define TRUE 1 /* sort of obvious */
- #endif
- #ifndef FALSE
- # define FALSE 0
- #endif
-
- #ifndef SEEK_SET /* These should all be declared in stdio.h! But */
- # define SEEK_SET 0 /* since they're not (in many cases), do so here. */
- # define SEEK_CUR 1
- # define SEEK_END 2
- #endif
-
- #ifndef S_IRUSR
- # define S_IRWXU 00700 /* read, write, execute: owner */
- # define S_IRUSR 00400 /* read permission: owner */
- # define S_IWUSR 00200 /* write permission: owner */
- # define S_IXUSR 00100 /* execute permission: owner */
- # define S_IRWXG 00070 /* read, write, execute: group */
- # define S_IRGRP 00040 /* read permission: group */
- # define S_IWGRP 00020 /* write permission: group */
- # define S_IXGRP 00010 /* execute permission: group */
- # define S_IRWXO 00007 /* read, write, execute: other */
- # define S_IROTH 00004 /* read permission: other */
- # define S_IWOTH 00002 /* write permission: other */
- # define S_IXOTH 00001 /* execute permission: other */
- #endif /* !S_IRUSR */
-
- #ifdef ZIPINFO /* these are individually checked because SysV doesn't */
- # ifndef S_IFBLK /* have some of them, Microsoft C others, etc. */
- # define S_IFBLK 0060000 /* block special */
- # endif
- # ifndef S_IFIFO /* in Borland C, not MSC */
- # define S_IFIFO 0010000 /* fifo */
- # endif
- # ifndef S_IFLNK /* in BSD, not SysV */
- # define S_IFLNK 0120000 /* symbolic link */
- # endif
- # ifndef S_IFSOCK /* in BSD, not SysV */
- # define S_IFSOCK 0140000 /* socket */
- # endif
- # ifndef S_ISUID
- # define S_ISUID 04000 /* set user id on execution */
- # endif
- # ifndef S_ISGID
- # define S_ISGID 02000 /* set group id on execution */
- # endif
- # ifndef S_ISVTX
- # define S_ISVTX 01000 /* directory permissions control */
- # endif
- # ifndef S_ENFMT
- # define S_ENFMT S_ISGID /* record locking enforcement flag */
- # endif
- #endif /* ZIPINFO */
-
-
-
-
-
- /**************/
- /* Typedefs */
- /**************/
-
- #ifndef _BULL_SOURCE /* Bull has it defined somewhere already */
- typedef unsigned char byte; /* code assumes UNSIGNED bytes */
- #endif /* !_BULL_SOURCE */
-
- typedef char boolean;
- typedef long longint;
- typedef unsigned short UWORD;
- typedef unsigned long ULONG;
- typedef unsigned char uch;
- typedef unsigned short ush;
- typedef unsigned long ulg;
-
- typedef struct min_info {
- unsigned unix_attr;
- unsigned dos_attr;
- int hostnum;
- longint offset;
- ULONG compr_size; /* compressed size (needed if extended header) */
- ULONG crc; /* crc (needed if extended header) */
- unsigned encrypted : 1; /* file encrypted: decrypt before uncompressing */
- unsigned ExtLocHdr : 1; /* use time instead of CRC for decrypt check */
- unsigned text : 1; /* file is text or binary */
- unsigned lcflag : 1; /* convert filename to lowercase */
- } min_info;
-
- typedef struct VMStimbuf {
- char *revdate; /* (both correspond to Unix modtime/st_mtime) */
- char *credate;
- } VMStimbuf;
-
- /*---------------------------------------------------------------------------
- Zipfile layout declarations. If these headers ever change, make sure the
- xxREC_SIZE defines (above) change with them!
- ---------------------------------------------------------------------------*/
-
- typedef byte local_byte_hdr[ LREC_SIZE ];
- # define L_VERSION_NEEDED_TO_EXTRACT_0 0
- # define L_VERSION_NEEDED_TO_EXTRACT_1 1
- # define L_GENERAL_PURPOSE_BIT_FLAG 2
- # define L_COMPRESSION_METHOD 4
- # define L_LAST_MOD_FILE_TIME 6
- # define L_LAST_MOD_FILE_DATE 8
- # define L_CRC32 10
- # define L_COMPRESSED_SIZE 14
- # define L_UNCOMPRESSED_SIZE 18
- # define L_FILENAME_LENGTH 22
- # define L_EXTRA_FIELD_LENGTH 24
-
- typedef byte cdir_byte_hdr[ CREC_SIZE ];
- # define C_VERSION_MADE_BY_0 0
- # define C_VERSION_MADE_BY_1 1
- # define C_VERSION_NEEDED_TO_EXTRACT_0 2
- # define C_VERSION_NEEDED_TO_EXTRACT_1 3
- # define C_GENERAL_PURPOSE_BIT_FLAG 4
- # define C_COMPRESSION_METHOD 6
- # define C_LAST_MOD_FILE_TIME 8
- # define C_LAST_MOD_FILE_DATE 10
- # define C_CRC32 12
- # define C_COMPRESSED_SIZE 16
- # define C_UNCOMPRESSED_SIZE 20
- # define C_FILENAME_LENGTH 24
- # define C_EXTRA_FIELD_LENGTH 26
- # define C_FILE_COMMENT_LENGTH 28
- # define C_DISK_NUMBER_START 30
- # define C_INTERNAL_FILE_ATTRIBUTES 32
- # define C_EXTERNAL_FILE_ATTRIBUTES 34
- # define C_RELATIVE_OFFSET_LOCAL_HEADER 38
-
- typedef byte ec_byte_rec[ ECREC_SIZE+4 ];
- /* define SIGNATURE 0 space-holder only */
- # define NUMBER_THIS_DISK 4
- # define NUM_DISK_WITH_START_CENTRAL_DIR 6
- # define NUM_ENTRIES_CENTRL_DIR_THS_DISK 8
- # define TOTAL_ENTRIES_CENTRAL_DIR 10
- # define SIZE_CENTRAL_DIRECTORY 12
- # define OFFSET_START_CENTRAL_DIRECTORY 16
- # define ZIPFILE_COMMENT_LENGTH 20
-
-
- typedef struct local_file_header { /* LOCAL */
- byte version_needed_to_extract[2];
- UWORD general_purpose_bit_flag;
- UWORD compression_method;
- UWORD last_mod_file_time;
- UWORD last_mod_file_date;
- ULONG crc32;
- ULONG compressed_size;
- ULONG uncompressed_size;
- UWORD filename_length;
- UWORD extra_field_length;
- } local_file_hdr;
-
- typedef struct central_directory_file_header { /* CENTRAL */
- byte version_made_by[2];
- byte version_needed_to_extract[2];
- UWORD general_purpose_bit_flag;
- UWORD compression_method;
- UWORD last_mod_file_time;
- UWORD last_mod_file_date;
- ULONG crc32;
- ULONG compressed_size;
- ULONG uncompressed_size;
- UWORD filename_length;
- UWORD extra_field_length;
- UWORD file_comment_length;
- UWORD disk_number_start;
- UWORD internal_file_attributes;
- ULONG external_file_attributes;
- ULONG relative_offset_local_header;
- } cdir_file_hdr;
-
- typedef struct end_central_dir_record { /* END CENTRAL */
- UWORD number_this_disk;
- UWORD num_disk_with_start_central_dir;
- UWORD num_entries_centrl_dir_ths_disk;
- UWORD total_entries_central_dir;
- ULONG size_central_directory;
- ULONG offset_start_central_directory;
- UWORD zipfile_comment_length;
- } ecdir_rec;
-
-
-
-
-
- /*************************/
- /* Function Prototypes */
- /*************************/
-
- #ifndef __
- # define __ OF
- #endif
-
- /*---------------------------------------------------------------------------
- Functions in unzip.c and/or zipinfo.c:
- ---------------------------------------------------------------------------*/
-
- int usage __((int error));
- int process_zipfile __((void));
- int find_end_central_dir __((void));
- int process_end_central_dir __((void));
- int list_files __((void)); /* unzip.c */
- int process_cdir_file_hdr __((void)); /* unzip.c */
- int process_local_file_hdr __((void)); /* unzip.c */
- int process_central_dir __((void));
- int long_info __((void)); /* zipinfo.c */
- int short_info __((void)); /* zipinfo.c */
- char *zipinfo_time __((UWORD *datez, UWORD *timez));
-
- /*---------------------------------------------------------------------------
- Functions in extract.c:
- ---------------------------------------------------------------------------*/
-
- int extract_or_test_files __((void));
- /* static int store_info __((void)); */
- /* static int extract_or_test_member __((void)); */
- int memextract __((byte *, ULONG, byte *, ULONG));
- int FlushMemory __((void));
- int ReadMemoryByte __((UWORD *x));
-
- /*---------------------------------------------------------------------------
- Decompression functions:
- ---------------------------------------------------------------------------*/
-
- int explode __((void)); /* explode.c */
-
- int inflate __((void)); /* inflate.c */
-
- void unReduce __((void)); /* unreduce.c */
- /* static void LoadFollowers __((void)); * unreduce.c */
-
- void unShrink __((void)); /* unshrink.c */
- /* static void partial_clear __((void)); * unshrink.c */
-
- /*---------------------------------------------------------------------------
- Functions in file_io.c and crypt.c:
- ---------------------------------------------------------------------------*/
-
- int open_input_file __((void)); /* file_io.c */
- int readbuf __((char *buf, register unsigned len));
- int create_output_file __((void)); /* file_io.c, vms.c */
- int FillBitBuffer __((void)); /* file_io.c */
- int ReadByte __((UWORD *x)); /* file_io.c */
- int FlushOutput __((void)); /* file_io.c, vms.c */
- /* static int dos2unix __((unsigned char *, int)); * file_io.c */
- void set_file_time_and_close __((void)); /* file_io.c */
- void handler __((int signal)); /* file_io.c */
- int echo __((int opt)); /* file_io.c */
- void echoff __((int f)); /* file_io.c */
- void echon __((void)); /* file_io.c */
- char *getp __((char *, char *, int)); /* file_io.c */
-
- int decrypt_byte __((void)); /* crypt.c */
- void update_keys __((int)); /* crypt.c */
- void init_keys __((char *)); /* crypt.c */
-
- /*---------------------------------------------------------------------------
- Macintosh file_io functions:
- ---------------------------------------------------------------------------*/
-
- #ifdef MACOS
- /* static int IsHFSDisk __((int)); */
- void macfstest __((int));
- int macmkdir __((char *, short, long));
- void ResolveMacVol __((short, short *, long *, StringPtr));
- short macopen __((char *, short, short, long));
- short maccreat __((char *, short, long, OSType, OSType));
- short macread __((short, char *, unsigned));
- short macwrite __((short, char *, unsigned));
- short macclose __((short));
- long maclseek __((short, long, short));
- #endif
-
- /*---------------------------------------------------------------------------
- OS/2 file_io functions:
- ---------------------------------------------------------------------------*/
-
- void ChangeNameForFAT __((char *name)); /* os2unzip.c */
- int IsFileNameValid __((char *name)); /* os2unzip.c */
- int GetCountryInfo __((void)); /* os2unzip.c */
- long GetFileTime __((char *name)); /* os2unzip.c */
- void SetPathInfo __((char *path, UWORD moddate, UWORD modtime, int flags));
- int SetLongNameEA __((char *name, char *longname)); /* os2unzip.c */
- int IsEA __((void *extra_field)); /* os2unzip.c */
- ULONG SizeOfEAs __((void *extra_field)); /* os2unzip.c */
- void SetEAs __((char *path, void *eablock)); /* os2unzip.c */
- int IsUpperNLS __((int nChr)); /* os2unzip.c */
- int ToLowerNLS __((int nChr)); /* os2unzip.c */
-
- /*---------------------------------------------------------------------------
- VMS file_io functions:
- ---------------------------------------------------------------------------*/
-
- int check_format __((void)); /* vms.c */
- int find_vms_attrs __((void)); /* vms.c */
- int CloseOutputFile __((void)); /* vms.c */
- /* static byte *extract_block __((struct extra_block *, int *, byte *, int));*/
- /* static int _flush_blocks __((int final_flag)); * vms.c */
- /* static int _flush_records __((int final_flag)); * vms.c */
- /* static int WriteBuffer __((unsigned char *buf, int len)); * vms.c */
- /* static int WriteRecord __((unsigned char *rec, int len)); * vms.c */
- /* static void message __((int string, char *status)); * vms.c */
-
- int VMSmunch __((char *, int, char *)); /* VMSmunch.c */
-
- /*---------------------------------------------------------------------------
- Functions in match.c, mapname.c, misc.c, etc.:
- ---------------------------------------------------------------------------*/
-
- int match __((char *string, char *pattern)); /* match.c */
-
- int mapname __((int create_dirs)); /* mapname.c */
-
- void UpdateCRC __((register unsigned char *s, register int len));
- int do_string __((unsigned int len, int option)); /* misc.c */
- time_t dos_to_unix_time __((unsigned ddate, unsigned dtime)); /* misc.c */
- int check_for_newer __((char *filename)); /* misc.c */
- int dateformat __((void)); /* misc.c */
- UWORD makeword __((byte *b)); /* misc.c */
- ULONG makelong __((byte *sig)); /* misc.c */
- void return_VMS __((int zip_error)); /* misc.c */
-
- void envargs __((int *, char ***, char *)); /* envargs.c */
-
- #ifdef AMIGA
- int utime __((char *file, time_t timep[])); /* utime.c */
- #endif /* AMIGA */
-
- #ifdef ZMEM /* these MUST be ifdef'd because of conflicts with the std def */
- char *memset __((register char *buf, register char init,
- register unsigned int len)); /* misc.c */
- char *memcpy __((register char *dst, register char *src,
- register unsigned int len)); /* misc.c */
- #endif /* ZMEM */
-
-
-
-
-
- /************/
- /* Macros */
- /************/
-
- #ifndef MAX
- # define MAX(a,b) ((a) > (b) ? (a) : (b))
- #endif
-
- #ifndef MIN
- # define MIN(a,b) ((a) < (b) ? (a) : (b))
- #endif
-
-
- #define LSEEK(abs_offset) {longint request=(abs_offset)+extra_bytes,\
- inbuf_offset=request%INBUFSIZ, bufstart=request-inbuf_offset;\
- if(request<0) {fprintf(stderr, SeekMsg, ReportMsg); return(3);}\
- else if(bufstart!=cur_zipfile_bufstart)\
- {cur_zipfile_bufstart=lseek(zipfd,bufstart,SEEK_SET);\
- if((incnt=read(zipfd,(char *)inbuf,INBUFSIZ))<=0) return(51);\
- inptr=inbuf+(int)inbuf_offset; incnt-=(int)inbuf_offset;} else\
- {incnt+=(inptr-inbuf)-(int)inbuf_offset; inptr=inbuf+(int)inbuf_offset;}}
-
- /*
- * Seek to the block boundary of the block which includes abs_offset,
- * then read block into input buffer and set pointers appropriately.
- * If block is already in the buffer, just set the pointers. This macro
- * is used by process_end_central_dir (unzip.c) and do_string (misc.c).
- * A slightly modified version is embedded within extract_or_test_files
- * (unzip.c). ReadByte and readbuf (file_io.c) are compatible.
- *
- * macro LSEEK(abs_offset)
- * ULONG abs_offset;
- * {
- * longint request = abs_offset + extra_bytes;
- * longint inbuf_offset = request % INBUFSIZ;
- * longint bufstart = request - inbuf_offset;
- *
- * if (request < 0) {
- * fprintf(stderr, SeekMsg, ReportMsg);
- * return(3); /-* 3: severe error in zipfile *-/
- * } else if (bufstart != cur_zipfile_bufstart) {
- * cur_zipfile_bufstart = lseek(zipfd, bufstart, SEEK_SET);
- * if ((incnt = read(zipfd,inbuf,INBUFSIZ)) <= 0)
- * return(51); /-* 51: unexpected EOF *-/
- * inptr = inbuf + (int)inbuf_offset;
- * incnt -= (int)inbuf_offset;
- * } else {
- * incnt += (inptr-inbuf) - (int)inbuf_offset;
- * inptr = inbuf + (int)inbuf_offset;
- * }
- * }
- *
- */
-
-
- #define SKIP_(length) if(length&&((error=do_string(length,SKIP))!=0))\
- {error_in_archive=error; if(error>1) return error;}
-
- /*
- * Skip a variable-length field, and report any errors. Used in zipinfo.c
- * and unzip.c in several functions.
- *
- * macro SKIP_(length)
- * UWORD length;
- * {
- * if (length && ((error = do_string(length, SKIP)) != 0)) {
- * error_in_archive = error; /-* might be warning *-/
- * if (error > 1) /-* fatal *-/
- * return (error);
- * }
- * }
- *
- */
-
-
- #define OUTB(intc) {*outptr++=(byte)(intc); if (++outcnt==OUTBUFSIZ)\
- FlushOutput();}
-
- /*
- * macro OUTB(intc)
- * {
- * *outptr++ = (byte)(intc);
- * if (++outcnt == OUTBUFSIZ)
- * FlushOutput();
- * }
- *
- */
-
-
- #define READBIT(nbits,zdest) {if(nbits>bits_left) FillBitBuffer();\
- zdest=(int)((UWORD)bitbuf&mask_bits[nbits]);bitbuf>>=nbits;bits_left-=nbits;}
-
- /*
- * macro READBIT(nbits,zdest)
- * {
- * if (nbits > bits_left)
- * FillBitBuffer();
- * zdest = (int)((UWORD)bitbuf & mask_bits[nbits]);
- * bitbuf >>= nbits;
- * bits_left -= nbits;
- * }
- *
- */
-
-
- #define PEEKBIT(nbits) (nbits>bits_left? (FillBitBuffer(),\
- (UWORD)bitbuf & mask_bits[nbits]) : (UWORD)bitbuf & mask_bits[nbits])
-
-
- #define NUKE_CRs(buf,len) {register int i,j; for (i=j=0; j<len;\
- (buf)[i++]=(buf)[j++]) if ((buf)[j]=='\r') ++j; len=i;}
-
- /*
- * Remove all the ASCII carriage returns from buffer buf (length len),
- * shortening as necessary (note that len gets modified in the process,
- * so it CANNOT be an expression). This macro is intended to be used
- * BEFORE A_TO_N(); hence the check for CR instead of '\r'. NOTE: The
- * if-test gets performed one time too many, but it doesn't matter.
- *
- * macro NUKE_CRs(buf,len)
- * {
- * register int i, j;
- *
- * for (i = j = 0; j < len; (buf)[i++] = (buf)[j++])
- * if ((buf)[j] == CR)
- * ++j;
- * len = i;
- * }
- *
- */
-
-
- #define TOLOWER(str1,str2) {char *ps1,*ps2; ps1=(str1)-1; ps2=(str2);\
- while(*++ps1) *ps2++=(char)(isupper((int)(*ps1))?tolower((int)(*ps1)):*ps1);\
- *ps2='\0';}
-
- /*
- * Copy the zero-terminated string in str1 into str2, converting any
- * uppercase letters to lowercase as we go. str2 gets zero-terminated
- * as well, of course. str1 and str2 may be the same character array.
- *
- * macro TOLOWER( str1, str2 )
- * {
- * char *ps1, *ps2;
- *
- * ps1 = (str1) - 1;
- * ps2 = (str2);
- * while (*++ps1)
- * *ps2++ = (char)(isupper((int)(*ps1))? tolower((int)(*ps1)) : *ps1);
- * *ps2='\0';
- * }
- *
- * NOTES: This macro makes no assumptions about the characteristics of
- * the tolower() function or macro (beyond its existence), nor does it
- * make assumptions about the structure of the character set (i.e., it
- * should work on EBCDIC machines, too). The fact that either or both
- * of isupper() and tolower() may be macros has been taken into account;
- * watch out for "side effects" (in the C sense) when modifying this
- * macro.
- */
-
-
- #ifndef ascii_to_native
- # define ascii_to_native(c) (c)
- # define A_TO_N(str1)
- #else
- # ifndef NATIVE
- # define NATIVE "native chars"
- # endif
- # define A_TO_N(str1) {register unsigned char *ps1;\
- for (ps1=str1; *ps1; ps1++) *ps1=ascii_to_native(*ps1);}
- #endif
-
- /*
- * Translate the zero-terminated string in str1 from ASCII to the native
- * character set. The translation is performed in-place and uses the
- * ascii_to_native macro to translate each character.
- *
- * macro A_TO_N( str1 )
- * {
- * register unsigned char *ps1;
- *
- * for (ps1 = str1; *ps1; ++ps1)
- * *ps1 = ascii_to_native(*ps1);
- * }
- *
- * NOTE: Using the ascii_to_native macro means that is it the only part of
- * unzip which knows which translation table (if any) is actually in use
- * to produce the native character set. This makes adding new character
- * set translation tables easy, insofar as all that is needed is an
- * appropriate ascii_to_native macro definition and the translation
- * table itself. Currently, the only non-ASCII native character set
- * implemented is EBCDIC, but this may not always be so.
- */
-
-
-
-
-
- /*************/
- /* Globals */
- /*************/
-
- extern int aflag;
- /* extern int bflag; reserved */
- extern int cflag;
- extern int fflag;
- extern int jflag;
- extern int overwrite_none;
- extern int overwrite_all;
- extern int force_flag;
- extern int quietflg;
- #ifdef DOS_OS2
- extern int sflag;
- #endif
- extern int tflag;
- extern int uflag;
- extern int V_flag;
- #ifdef VMS
- extern int secinf;
- #endif
- #ifdef MACOS
- extern int hfsflag;
- #endif
- extern int process_all_files;
- extern longint csize;
- extern longint ucsize;
- extern char *fnames[];
- extern char **fnv;
- extern char sig[];
- extern char answerbuf[];
- extern min_info *pInfo;
- extern char *key;
- extern ULONG keys[];
-
- #ifdef MACOS
- union work {
- struct {
- short *Prefix_of; /* (8193 * sizeof(short)) */
- byte *Suffix_of;
- byte *Stack;
- } shrink;
- byte *Slide;
- };
- #else
- union work {
- struct {
- short Prefix_of[HSIZE + 2]; /* (8194 * sizeof(short)) */
- byte Suffix_of[HSIZE + 2]; /* also s-f length_nodes (smaller) */
- byte Stack[HSIZE + 2]; /* also s-f distance_nodes (smaller) */
- } shrink;
- byte Slide[WSIZE];
- };
- #endif
- extern union work area;
-
- # define prefix_of area.shrink.Prefix_of
- # define suffix_of area.shrink.Suffix_of
- # define stack area.shrink.Stack
- # define slide area.Slide
-
- extern ULONG crc32val;
- extern UWORD mask_bits[];
-
- extern byte *inbuf;
- extern byte *inptr;
- extern int incnt;
- extern ULONG bitbuf;
- extern int bits_left;
- extern boolean zipeof;
- extern int zipfd;
- #ifdef MSWIN
- extern char *zipfn;
- #else
- extern char zipfn[];
- #endif
- extern longint extra_bytes;
- extern longint cur_zipfile_bufstart;
- extern byte *extra_field;
- extern char local_hdr_sig[];
- extern char central_hdr_sig[];
- extern char end_central_sig[];
- extern local_file_hdr lrec;
- extern cdir_file_hdr crec;
- extern ecdir_rec ecrec;
- extern struct stat statbuf;
-
- extern byte *outbuf;
- extern byte *outptr;
- #ifdef MSWIN
- extern byte __far *outout;
- extern char *filename;
- #else
- extern byte *outout;
- extern char filename[];
- #endif
- extern longint outpos;
- extern int outcnt;
- extern int outfd;
- extern int mem_mode;
- extern int disk_full;
-
- extern char *EndSigMsg;
- extern char *CentSigMsg;
- extern char *SeekMsg;
- extern char *ReportMsg;
-
- #ifdef DECLARE_ERRNO
- extern int errno;
- #endif
-
- #ifdef EBCDIC
- extern byte ebcdic[];
- #endif
-
- #ifdef MACOS
- extern short gnVRefNum;
- extern long glDirID;
- extern OSType gostCreator;
- extern OSType gostType;
- extern boolean fMacZipped;
- extern boolean macflag;
- extern short giCursor;
- extern CursHandle rghCursor[];
- #endif
-